package com.jim.director.framework.validation;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 注解校验报告
 * 汇总所有类的校验结果，提供统一的报告接口
 *
 * @author Jim
 * @date 2024/10/5
 */
public class ValidationReport {

    private List<ValidationResult> results;
    private long validationTime;
    private int totalClasses;

    public ValidationReport() {
        this.results = new ArrayList<>();
        this.validationTime = System.currentTimeMillis();
    }

    /**
     * 添加单个类的校验结果
     */
    public void addResult(ValidationResult result) {
        this.results.add(result);
        this.totalClasses++;
    }

    /**
     * 检查整体校验是否通过
     */
    public boolean isValid() {
        return results.stream().allMatch(ValidationResult::isValid);
    }

    /**
     * 检查是否有警告
     */
    public boolean hasWarnings() {
        return results.stream().anyMatch(ValidationResult::hasWarnings);
    }

    /**
     * 获取所有错误信息
     */
    public List<String> getAllErrors() {
        return results.stream()
                .flatMap(result -> result.getErrors().stream())
                .collect(Collectors.toList());
    }

    /**
     * 获取所有警告信息
     */
    public List<String> getAllWarnings() {
        return results.stream()
                .flatMap(result -> result.getWarnings().stream())
                .collect(Collectors.toList());
    }

    /**
     * 获取失败的类列表
     */
    public List<String> getFailedClasses() {
        return results.stream()
                .filter(result -> !result.isValid())
                .map(ValidationResult::getValidatedClass)
                .collect(Collectors.toList());
    }

    /**
     * 获取有警告的类列表
     */
    public List<String> getWarningClasses() {
        return results.stream()
                .filter(ValidationResult::hasWarnings)
                .map(ValidationResult::getValidatedClass)
                .collect(Collectors.toList());
    }

    /**
     * 获取错误数量
     */
    public int getErrorCount() {
        return results.stream()
                .mapToInt(result -> result.getErrors().size())
                .sum();
    }

    /**
     * 获取警告数量
     */
    public int getWarningCount() {
        return results.stream()
                .mapToInt(result -> result.getWarnings().size())
                .sum();
    }

    /**
     * 生成格式化的报告字符串
     */
    public String generateReport() {
        StringBuilder report = new StringBuilder();
        report.append("\n=== Director框架注解校验报告 ===\n");
        report.append("校验时间: ").append(new java.util.Date(validationTime)).append("\n");
        report.append("总计类数: ").append(totalClasses).append("\n");
        report.append("错误数量: ").append(getErrorCount()).append("\n");
        report.append("警告数量: ").append(getWarningCount()).append("\n");
        report.append("校验结果: ").append(isValid() ? "通过" : "失败").append("\n");

        if (!isValid()) {
            report.append("\n--- 错误详情 ---\n");
            for (String error : getAllErrors()) {
                report.append("❌ ").append(error).append("\n");
            }
        }

        if (hasWarnings()) {
            report.append("\n--- 警告详情 ---\n");
            for (String warning : getAllWarnings()) {
                report.append("⚠️  ").append(warning).append("\n");
            }
        }

        if (isValid() && !hasWarnings()) {
            report.append("\n✅ 所有注解配置正确！\n");
        }

        report.append("==============================\n");
        return report.toString();
    }

    public List<ValidationResult> getResults() {
        return new ArrayList<>(results);
    }

    public int getTotalClasses() {
        return totalClasses;
    }
}

